package cn.zyy.hotel.controller;

import cn.zyy.hotel.entity.User;
import cn.zyy.hotel.service.UserService;
import cn.zyy.hotel.utils.SystemConstant;
import cn.zyy.hotel.vo.UserVO;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private RedisTemplate redisTemplate;

    //注册
    @ResponseBody
    @RequestMapping("/register")
    public Object register(User user){
        //创建map集合，保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        //调用注册的方法
        if (userService.addUser(user)>0){
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"恭喜你，注册成功!");
        }else {
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"很遗憾，注册失败，请重新尝试!");
        }
        return map;
    }

    //检查用户名是否存在
    @ResponseBody
    @RequestMapping("/checkName")
    public Object checkName(String loginName){
        //创建map集合，保存结果信息
        Map<String,Object> map = new HashMap<String, Object>();
        //调用根据用户名查询用户信息的方法
        if (userService.selectUserByName(loginName) != null){
            map.put(SystemConstant.EXIST,true);
            map.put(SystemConstant.MESSAGE,"用户名已被使用，请重新输入!");
        }else {
            map.put(SystemConstant.EXIST,false);
        }
        return map;
    }

    //检查手机号是否存在
    @ResponseBody
    @RequestMapping("/checkPhone")
    public Object checkPhone(String phone){
        //创建map集合，保存结果信息
        Map<String,Object> map = new HashMap<String, Object>();
        //调用根据用户名查询用户信息的方法
        if (userService.selectUserByPhone(phone) != null){
            map.put(SystemConstant.EXIST,true);
            map.put(SystemConstant.MESSAGE,"改手机号已注册，请重新输入!");
        }else {
            map.put(SystemConstant.EXIST,false);
        }
        return map;
    }

    //检查身份证是否存在
    @ResponseBody
    @RequestMapping("/checkIdCard")
    public Object checkIdCard(String idCard){
        //创建map集合，保存结果信息
        Map<String,Object> map = new HashMap<String, Object>();
        //调用根据身份证查询用户信息的方法
        if (userService.selectUserByIdCard(idCard) != null){
            map.put(SystemConstant.EXIST,true);
            map.put(SystemConstant.MESSAGE,"该身份证号已被使用，请重新输入!");
        }else {
            map.put(SystemConstant.EXIST,false);
        }
        return map;
    }

    //检查邮箱是否存在
    @ResponseBody
    @RequestMapping("/checkEmail")
    public Object checkEmail(String email){
        //创建map集合，保存结果信息
        Map<String,Object> map = new HashMap<String, Object>();
        //调用根据邮箱查询用户信息的方法
        if (userService.selectUserByEmail(email) != null){
            map.put(SystemConstant.EXIST,true);
            map.put(SystemConstant.MESSAGE,"该邮箱已被使用，请重新输入!");
        }else {
            map.put(SystemConstant.EXIST,false);
        }
        return map;
    }

    //登录
    @ResponseBody
    @RequestMapping("/login")
    public Object login(String loginName, String password, HttpSession session){
        //创建map集合，保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        String key = SystemConstant.FRONT_LOGIN_USER+loginName;
        User loginUser = null;
        if (redisTemplate.hasKey(key)){
            loginUser = (User)redisTemplate.opsForValue().get(key);
        }else {
            //调用登录的方法
            loginUser = userService.login(loginName, password);
            redisTemplate.opsForValue().set(key,loginUser);
        }
        //判断对象是否为空
        if (loginUser!=null){
            map.put(SystemConstant.SUCCESS,true);
            //清空密码
            loginUser.setPassword(null);
            //保存用户信息到session中
            session.setAttribute(SystemConstant.FRONT_LOGIN_USER,loginUser);
        }else {
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"用户名或密码错误，请重新输入!");
        }
        return map;
    }

    //退出登录
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        //清空session
        session.removeAttribute(SystemConstant.FRONT_LOGIN_USER);
        //重定向到登录页面
        return "redirect:/index.html";
    }

    //修改用户信息
    @ResponseBody
    @RequestMapping("/updateUser")
    public Object updateUser(User user,HttpSession session){
        //创建map集合，保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        //调用修改用户信息的方法
        if (userService.updateUser(user) > 0){
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"修改成功");
            User loginUser = userService.selectUserByName(user.getLoginName());
            //清空密码
            loginUser.setPassword(null);
            //保存用户信息到session中
            session.setAttribute(SystemConstant.FRONT_LOGIN_USER,loginUser);
            if (redisTemplate.hasKey(SystemConstant.FRONT_LOGIN_USER+user.getLoginName())){
                redisTemplate.delete(SystemConstant.FRONT_LOGIN_USER+user.getLoginName());
            }
        }else {
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"修改失败");
        }
        return map;
    }

    //修改用户密码
    @ResponseBody
    @RequestMapping("/updatePwd")
    public Object updatePwd(UserVO userVO,HttpSession session){
        //创建map集合，保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        //调用修改密码的方法
        if (userService.updatePwd(userVO) > 0){
            //清空session
            session.removeAttribute(SystemConstant.FRONT_LOGIN_USER);
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"修改成功");
            if (redisTemplate.hasKey(SystemConstant.FRONT_LOGIN_USER+userVO.getLoginName())){
                redisTemplate.delete(SystemConstant.FRONT_LOGIN_USER+userVO.getLoginName());
            }
        }else {
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"修改失败");
        }
        return map;
    }


}
